🗺️ Isomap

📅 Январь 2026

🔷 1. Суть метода

🔷 2. Базовый код

from sklearn.manifold import Isomap
import numpy as np

# Базовое использование
isomap = Isomap(
    n_neighbors=5,
    n_components=2,
    metric='minkowski'
)
X_reduced = isomap.fit_transform(X)

# Получить геодезические расстояния
dist_matrix = isomap.dist_matrix_

# Реконструкция
X_reconstructed = isomap.reconstruction_error()

print(f"Reconstruction error: {isomap.reconstruction_error():.3f}")
Isomap визуализация

🔷 3. Ключевые параметры

Сравнение n_neighbors
ПараметрОписаниеСовет
n_neighborsЧисло соседей для графа5-20, больше = глобальнее
n_componentsРазмерность выхода2-3 для визуализации
radiusРадиус для ε-графаNone = использовать n_neighbors
metricМетрика расстояния'minkowski', 'cosine', etc.
neighbors_algorithmАлгоритм поиска соседей'auto', 'ball_tree', 'kd_tree'

🔷 4. Алгоритм работы

  1. Построение графа: создать k-NN граф для всех точек
  2. Кратчайшие пути: вычислить расстояния между всеми парами точек через граф (геодезические)
  3. MDS: применить классическое многомерное шкалирование:
    • Центрировать матрицу расстояний
    • Вычислить собственные векторы и значения
    • Выбрать k наибольших собственных векторов
  4. Вложение: координаты = sqrt(λ_i) · v_i

Геодезическое расстояние: длина кратчайшего пути по многообразию

🔷 5. Выбор n_neighbors

# Тестировать разные значения
from sklearn.metrics import pairwise_distances
import matplotlib.pyplot as plt

neighbors = [5, 10, 15, 20, 30]
errors = []

for n in neighbors:
    iso = Isomap(n_neighbors=n, n_components=2)
    X_iso = iso.fit_transform(X)
    error = iso.reconstruction_error()
    errors.append(error)
    print(f"n={n}: error={error:.3f}")

# Визуализировать
plt.plot(neighbors, errors, 'o-')
plt.xlabel('n_neighbors')
plt.ylabel('Reconstruction Error')
plt.title('Выбор n_neighbors')
plt.show()

# Выбрать минимум или "колено"

🔷 6. Когда использовать

✅ Хорошо

  • Данные на нелинейном многообразии
  • Визуализация high-dim данных
  • Swiss roll, S-curve типы данных
  • Сохранение глобальной структуры
  • Среднее число точек (1K-50K)

❌ Плохо

  • Очень большие данные (>100K)
  • Данные с дырами в многообразии
  • Множество отдельных многообразий
  • Нужна быстрая работа
  • Локальные структуры важнее глобальных

🔷 7. Предобработка

Масштабирование

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

Удаление выбросов: выбросы могут искажать граф соседей

Связность графа: проверить, что граф связен

from scipy.sparse.csgraph import connected_components

# Построить граф
from sklearn.neighbors import kneighbors_graph
G = kneighbors_graph(X, n_neighbors=5, mode='distance')

# Проверить связность
n_components, labels = connected_components(G)
print(f"Компонент связности: {n_components}")
# Должна быть 1!

🔷 8. Проблемы и решения

ПроблемаРешение
Граф не связенУвеличить n_neighbors
Плохое качествоПодобрать n_neighbors, проверить данные
Медленная работаУменьшить размер данных, использовать подвыборку
Много памятиSparse distances, меньше точек
Short-circuitУменьшить n_neighbors (граф слишком плотный)

🔷 9. Сравнение с другими методами

МетодПреимущества IsomapНедостатки Isomap
PCAНелинейное, лучше для изогнутых данныхМедленнее, требует связности
t-SNEСохраняет глобальную структуруХуже для локальных структур
LLEЛучше глобальная структураХуже для hole-данных
UMAPТеоретически обоснованМедленнее, менее гибкий

🔷 10. Чек-лист

  • [ ] Масштабировать данные
  • [ ] Выбрать n_neighbors (5-20)
  • [ ] Проверить связность графа
  • [ ] Установить n_components (2-3)
  • [ ] Проверить reconstruction error
  • [ ] Визуализировать результат
  • [ ] Сравнить с PCA и t-SNE
  • [ ] Попробовать разные n_neighbors

💡 Объяснение заказчику:

«Isomap "разворачивает" сложные искривленные структуры в данных, сохраняя истинные расстояния вдоль поверхности. Как разглаживание мятой бумаги — метод находит двумерное представление, где расстояния соответствуют путям по исходной поверхности данных».